package demon1;
//多态：通俗的来讲，就是多种形态，具体点就是去完成某个行为，
//当不同的对象去完成时会产生不同的状态。
class Animal{
    public String name;
    public int age;
    public Animal(String name,int age){
        this.name=name;
        this.age=age;
    }
    public Animal eat(){
        System.out.println(this.name+"正在吃！");
        return null;
    }
}
class Dog extends Animal{
    public Dog(String name,int age){  //alt+回车
        super(name,age);
    }
    @Override
    public Dog eat(){
        System.out.println(this.name+"在吃狗粮");
        return null;
    }
    public void bark(){
        System.out.println(this.name+"汪汪叫");
    }
}
class Bird extends Animal{
    @Override  //注解（帮助检查是否重写）   修饰该方法，该方法就是被重写的。   重载是Overload
    public Bird eat(){
        System.out.println(this.name+"吃鸟粮");
        return null;
    }
    public Bird(String name,int age){
        super(name,age);
    }
    public void jiji(){
        System.out.println(this.name+"吱吱叫");
    }
}
//要理解多态就要知道 ：向上转型和方法重写
//放法的重写：方法名相同，方法的参数列表相同（个数，顺序，类型一模一样），方法的返回值相同。方法重写是子类与父类的一种多态表现。
//把子类对象给父类就是向上转型，把父类对象给子类就是向下转型。
//静态绑定：在编译的时候就确定调用哪个方法了  比如说add（int，int）  add（1，2）

//重写总结：静态方法不能被重写  被private修饰的不能被重写    被final修饰的不能被重写  如果方法被重写子类的权限要大于等于父类的权限
//被重写的方法返回值类型可以不同，但是必须是具有父子关系的。(协变类型)
public class polymorphism {
    public static Animal func2(){  //这三种方式都可以发生向上转型  49--57行代码
        return new Dog("小黄",10);
    }
    public static void func(Animal animal){
        animal.eat();

    }
    public static void main(String[] args){
        Animal animal1= new Dog("小黄",10);
        Animal animal2=new Bird("小白",11);
        Dog dog=new Dog("小黄",10);
        Bird bird=new Bird("小白",11);
        func(dog);
        func(bird);
        func(new Dog("小黄",10));
        //当animal引用的对象不一样，调用eat方法表现的行为不一样，此时就叫做多态
        //因为同一个引用调用同一个方法，表现的行为不一样。

    }
    public static void main1(String[] args){
        Animal animal=new Dog("小黄",10);
        animal.eat();  //动态绑定（必须发生重写和向上转型且通过父类引用调用了父类和子类中的重写的方法），会执行dog里面的eat方法。
       // animal.bark();//会报错  原因是：animal当中没有bark这个方法，通过父类引用访问的时候，只能访问父类自己特有的。
        // System.out.println();
    }
    //反汇编  javap-c 文件名 不用加后缀


}
